home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / rhstdlib.arc / GETS.ASM < prev    next >
Assembly Source File  |  1990-10-20  |  2KB  |  93 lines

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3. ;
  4.         extrn    sl_malloc:far, sl_realloc:far
  5.         extrn    sl_putc:far, sl_getc:far
  6. ;
  7. ;
  8. ; GETS-    Reads a line of text from the user and returns a pointer to the
  9. ;    string read.  Returns the pointer in ES:DI.  Carry=0 if no error,
  10. ;    1 if heap overflow.
  11. ;
  12. ;    The returned string is zero terminated and does not include the
  13. ;    carriage return (ENTER) key code.
  14. ;
  15. ; Note: This routine always allocates 256 bytes when you call
  16. ;    it.  
  17. ;
  18. ;
  19. ;
  20. ;
  21.         public    sl_gets
  22. sl_gets        proc    far
  23.         push    ax
  24.         push    bx
  25.         push    cx
  26.         pushf
  27. ;
  28. ; Allocate storage for return string:
  29. ;
  30.         mov    cx, 256
  31.         call    sl_malloc
  32.         jc    BadGETS
  33. ;
  34. ; Read data from keyboard until the user hits the enter key.
  35. ;
  36.         xor    bx, bx
  37. RdKbdLp:    call    sl_getc
  38.         cmp    al, 08                ;Backspace
  39.         jne    NotBS
  40.         or    bx, bx                 ;Don't do it if at
  41.         jz    RdKbdLp                ; beginning of line.
  42.         dec    bx
  43.         call    sl_putc
  44.         jmp    RdKbdLp
  45. ;
  46. NotBS:        cmp    al, 13                ;See if ENTER.
  47.         jnz    NotCR
  48.         call    sl_putc
  49.         mov    al, 0ah
  50.         call    sl_putc
  51.         mov    byte ptr es:[bx][di], 0
  52.         inc    bx
  53.         jmp    GetsDone
  54. ;
  55. NotCR:        cmp    al, 1bh                ;ESC
  56.         jne    NotESC
  57.         mov    al, 8
  58. EraseLn:    call    sl_putc
  59.         dec    bx
  60.         jne    EraseLn
  61.         jmp    RdKbdLp
  62. ;
  63. NotESC:        mov    es:[bx][di], al
  64.         call    sl_putc
  65.         inc    bx
  66.         cmp    bx, 255
  67.         jb    RdKbdLp
  68.         mov    al, 7                ;Bell
  69.         call    sl_putc
  70.         dec    bx
  71.         jmp    RdKbdLp
  72. ;
  73. ; Deallocate any left over storage:
  74. ;
  75. GetsDone:    mov    cx, bx
  76.         call    sl_realloc
  77.         popf
  78.         clc
  79.         pop     cx
  80.         pop    bx
  81.         pop    ax
  82.         ret
  83. ;
  84. BadGETS:    popf
  85.         stc
  86.         pop    cx
  87.         pop    bx
  88.         pop    ax
  89.         ret
  90. sl_gets        endp
  91. stdlib        ends
  92.         end
  93.